import {defineStore} from 'pinia';
import {RouteRecordRaw} from 'vue-router';

import {RouteItem} from '@/api/model/permissionModel';
import {getMenuList} from '@/api/permission';
import router, {fixedRouterList, homepageRouterList} from '@/router';
import {store} from '@/store';
import {transformObjectToRoute} from '@/utils/route';
import {getPermsApi} from "@/api/login";

export const usePermissionStore = defineStore('permission', {
    state: () => ({
        whiteListRouters: ['/login'],
        routers: [],
        removeRoutes: [],
        asyncRoutes: [],
        perms: [],
        roles: [],
    }),
    actions: {
        async initRoutes() {
            const accessedRouters = this.asyncRoutes;

            // 在菜单展示全部路由
            this.routers = [...homepageRouterList, ...accessedRouters, ...fixedRouterList];
            // 在菜单只展示动态路由和首页
            // this.routers = [...homepageRouterList, ...accessedRouters];
            // 在菜单只展示动态路由
            // this.routers = [...accessedRouters];
        },
        async buildAsyncRoutes() {
            try {
                // 发起菜单权限请求 获取菜单列表
                const asyncRoutes: Array<RouteItem> = await getMenuList();
                this.asyncRoutes = transformObjectToRoute(asyncRoutes);
                await this.initRoutes();
                return this.asyncRoutes;
            } catch (error) {
                throw new Error("Can't build routes");
            }
        },
        async restoreRoutes() {
            // 不需要在此额外调用initRoutes更新侧边导肮内容，在登录后asyncRoutes为空会调用
            this.asyncRoutes.forEach((item: RouteRecordRaw) => {
                if (item.name) {
                    router.removeRoute(item.name);
                }
            });
            this.asyncRoutes = [];
        },
        async getPerms() {
            const { roles, perms } = await getPermsApi();
            this.roles = roles;
            this.perms = perms;
        }
    },
});

export function getPermissionStore() {
    return usePermissionStore(store);
}
